// 导入sleep函数，用于在需要时让程序暂停执行
import { sleep } from '$/utils'

/**
 * 定义一个用于管理对话框状态的钩子函数
 * 该函数主要管理对话框的可见状态、加载状态和传递参数
 * @returns {Object} 返回包含对话框状态管理所需属性和方法的对象
 */
export function useDialog() {
  // 定义对话框的可见状态，默认为不可见
  const visible = ref(false)
  // 定义一个用于延迟渲染的可见状态，以实现更好的性能或动画效果
  const lazyVisible = ref(false)
  // 定义对话框的加载状态，默认为不加载
  const loading = ref(false)
  // 定义对话框的参数对象，用于传递和管理对话框所需的数据
  const params = ref({})

  // 监视对话框可见状态的变化，当状态变化时执行相应的逻辑
  watch(
    () => visible.value,
    async (value) => {
      // 当对话框不可见时，使用sleep函数暂停执行，以实现延迟渲染效果
      if (!value) {
        await sleep()
      }
      // 将当前可见状态赋值给延迟渲染的可见状态
      lazyVisible.value = value
    },
  )

  /**
   * 打开对话框的方法
   * 接受一个参数对象，用于传递给对话框
   * @param {Object} args 包含参数的对象
   */
  function open(args) {
    // 设置对话框为可见状态
    visible.value = true
    // 将传递的参数赋值给对话框的参数对象，如果没有参数则使用空对象
    params.value = args?.params ?? {}
  }

  /**
   * 关闭对话框的方法
   * 不接受参数
   */
  function close() {
    // 设置对话框为不可见状态
    visible.value = false
  }

  /**
   * 重置对话框状态的方法
   * 不接受参数
   */
  function reset() {
    // 设置对话框为不可见状态
    visible.value = false
    // 设置对话框的加载状态为不加载
    loading.value = false
    // 清空对话框的参数对象
    params.value = {}
  }

  // 返回包含对话框状态管理所需属性和方法的对象
  return {
    visible,
    lazyVisible,
    loading,
    params,
    open,
    close,
    reset,
  }
}

// 默认导出useDialog函数
export default useDialog
